package org.groupg.practice.guiPractice.awt;

import cn.hutool.core.lang.Console;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;

public class DrawTest {

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            var frame = new DrawFrame();
            frame.setTitle("DrawTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true); //
//            frame.setForeground(Color.MAGENTA);// 设置前景色
            frame.setBackground(Color.green);// 设置背景色 没有用？ 不，确实设置了，但实际上这个方法设置了根窗格，咱们看到的是内容窗格
//            frame.getContentPane().setForeground(Color.cyan);
            frame.getContentPane().setBackground(Color.GRAY);// 设置背景色，确实看到了背景色被设置为灰色
            Console.log("当前窗口背景色为：", frame.getBackground());
            frame.getRootPane().setBackground(Color.MAGENTA);
            Console.log("当前窗口背景色为：", frame.getBackground());
            frame.getGlassPane().setBackground(Color.cyan);
            Console.log("当前窗口背景色为：", frame.getBackground());
            frame.getLayeredPane().setBackground(Color.white);
            Console.log("当前窗口背景色为：", frame.getBackground());
            // 当前窗口背景色为： java.awt.Color[r=0,g=255,b=0]
            // 当前窗口背景色为： java.awt.Color[r=0,g=255,b=0]
            // 当前窗口背景色为： java.awt.Color[r=0,g=255,b=0]
            // 当前窗口背景色为： java.awt.Color[r=0,g=255,b=0]
            // 经验证，frame 的背景色与其他位置无关
        });
    }

}

class DrawFrame extends JFrame {

    static Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    private static final int DEFAULT_WIDTH = dimension.width / 4 * 3;
    private static final int DEFAULT_HEIGHT = dimension.height / 4 * 3;

    public DrawFrame() {

        // 设置窗口大小
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        // 设置窗口位置 （正中处理法
//        setLocation((dimension.width / 2) - (DEFAULT_WIDTH / 2), (dimension.height / 2) - (DEFAULT_HEIGHT / 2));
        setLocationByPlatform(true);
        add(new DrawComponent());
        pack();
    }
}

class DrawComponent extends JComponent {
    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 400;
    int i = 0;

    @Override
    protected void paintComponent(Graphics g) {


        var g2 = (Graphics2D) g;

        double leftX = 100;
        double topY = 100;
        double width = 200;
        double height = 150;
        Console.log("=====================================计数：{}" + i++);


        /*
         Rectangle2D Line2D Ellipse2D
         */

        // 矩形 相对左上角的坐标和宽高
        var rect = new Rectangle2D.Double(leftX, topY, width, height);
        g2.setPaint(Color.BLUE);// 会影响到下面所有的图像处理 只有被再次调用才会取消
        g2.draw(rect);// draw 是 划边


        Console.log("rect 中心点的 X 坐标", rect.getCenterX());
        Console.log("rect 中心点的 Y 坐标", rect.getCenterY());
        Console.log("rect 最小 X 坐标", rect.getMinX());
        Console.log("rect 最小 Y 坐标", rect.getMinY());
        Console.log("rect 最大 X 坐标", rect.getMaxX());
        Console.log("rect 最大 Y 坐标", rect.getMaxY());

        Console.log("rect 左上角 X 坐标", rect.getX());
        Console.log("rect 左上角 Y 坐标", rect.getY());


        // 矩形里面的圆
        var ellipse = new Ellipse2D.Double();
        ellipse.setFrame(rect);
        g2.draw(ellipse);

        Console.log("ellipse 中心点的 X 坐标", ellipse.getCenterX());
        Console.log("ellipse 中心点的 Y 坐标", ellipse.getCenterY());
        Console.log("ellipse 最小 X 坐标", ellipse.getMinX());
        Console.log("ellipse 最小 Y 坐标", ellipse.getMinY());
        Console.log("ellipse 最大 X 坐标", ellipse.getMaxX());
        Console.log("ellipse 最大 Y 坐标", ellipse.getMaxY());

        Console.log("ellipse 左上角 X 坐标", ellipse.getX());
        Console.log("ellipse 左上角 Y 坐标", ellipse.getY());

        // 直线 x1–起点的X坐标 y1–起点的Y坐标 x2–终点的X坐标 y2–终点的Y坐标
        g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));

        // 获取 中心点 的 X 坐标
        double centerX = rect.getCenterX();
        // 获取 中心点 的 Y 坐标
        double centerY = rect.getCenterY();
        double radius = 150;


        // 基于指定的中心点坐标和角点坐标设置此形状的框架矩形。矩形的子类使用框架矩形来定义其几何图形。 圆
        // 其实口是先画了外部的方框再画的圆
        //      centerX–指定中心点的X坐标
        //      centerY–指定中心点角的Y坐标
        //      X–指定角点角的X坐标
        //      Y–指定角点将的Y坐标
        var circle = new Ellipse2D.Double();
        circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);

        g2.draw(circle);

        Console.log("circle 中心点的 X 坐标", circle.getCenterX());
        Console.log("circle 中心点的 Y 坐标", circle.getCenterY());
        Console.log("circle 最小 X 坐标", circle.getMinX());
        Console.log("circle 最小 Y 坐标", circle.getMinY());
        Console.log("circle 最大 X 坐标", circle.getMaxX());
        Console.log("circle 最大 Y 坐标", circle.getMaxY());

        Console.log("circle 左上角 X 坐标", circle.getX());
        Console.log("circle 左上角 Y 坐标", circle.getY());

        // 设置颜色的行为
        g2.setPaint(Color.pink);
        // 填充要处理的图形
        g2.fill(new Ellipse2D.Double(200, 200, 100, 100));
        // 设置颜色
        g2.setPaint(Color.RED);
        // 写文字
        g2.drawString("Waning", 100, 100);


    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}
